/*
 * layout.cpp
 *
 *  Created on: 26/11/2012
 *      Author: guidi
 */

#include "layout.h"
#include "compresor.h"
#include "descompresor.h"
#include "boton-elegir-archivos.h"
#include "rle-encoder.h"
#include "const.cpp"
#include <gtkmm-3.0/gtkmm.h>
#include <gtkmm-3.0/gtkmm/messagedialog.h>

Layout::Layout(int argc, char* argv[]) :
		kit(argc, argv) {

	Glib::ustring temp = "destino";
	ventana = new Gtk::Window;
	notebook = new Gtk::Notebook;
	compresionBox = new Gtk::Box;
	descompresionBox = new Gtk::Box;
	notebook->append_page(*compresionBox, "compresion");
	notebook->append_page(*descompresionBox, "descompresion");

	compresionOrigen = new BotonElegirArchivos(*ventana,
			Gtk::FILE_CHOOSER_ACTION_OPEN, false);
	compresionDestino = new BotonElegirArchivos(*ventana,
			Gtk::FILE_CHOOSER_ACTION_SAVE, true, EXTENSION);
	descompresionOrigen = new BotonElegirArchivos(*ventana,
			Gtk::FILE_CHOOSER_ACTION_OPEN, false, EXTENSION);
	descompresionDestino = new BotonElegirArchivos(*ventana,
			Gtk::FILE_CHOOSER_ACTION_SAVE, true);

	ejecutarCompresion = new Gtk::Button("Comprimir");
	ejecutarCompresion->add(
			*(new Gtk::Image(Gtk::Stock::FILE, Gtk::ICON_SIZE_MENU)));

	ejecutarCompresion->signal_clicked().connect(
			sigc::mem_fun(*this, &Layout::comprimir));

	ejecutarDescompresion = new Gtk::Button("Descomprimir");
	ejecutarDescompresion->signal_clicked().connect(
			sigc::mem_fun(*this, &Layout::descomprimir));
	compresionBox->add(*compresionOrigen);
	compresionBox->add(*compresionDestino);
	compresionBox->add(*ejecutarCompresion);
	descompresionBox->add(*descompresionOrigen);
	descompresionBox->add(*descompresionDestino);
	descompresionBox->add(*ejecutarDescompresion);
	compresionOrigen->show();
	compresionDestino->show();
	descompresionOrigen->show();
	descompresionDestino->show();
	ejecutarCompresion->show();
	ejecutarDescompresion->show();
	compresionBox->show();
	descompresionBox->show();
	notebook->show();
	ventana->add(*notebook);
}

Layout::~Layout() {

}

void Layout::iniciar() {
	kit.run(*ventana);
}

void Layout::comprimir() {
	RLEencoder encoder;
	int resultado = ERROR_UNDEFINED;
	if (compresionOrigen->getArchivo() == compresionDestino->getArchivo())
		resultado = ERROR_ARCHIVOS_IGUALES;
	else
		resultado = encoder.comprimir(compresionOrigen->getArchivo(),
			compresionDestino->getArchivo());
	mostrarDialogoDeResultado(resultado, COMPRIMIR);
}

void Layout::descomprimir() {
	RLEencoder encoder;
	int resultado = ERROR_UNDEFINED;
	if (descompresionOrigen->getArchivo() == descompresionDestino->getArchivo())
		resultado = ERROR_ARCHIVOS_IGUALES;
	else
		resultado = encoder.descomprimir(descompresionOrigen->getArchivo(),
			descompresionDestino->getArchivo());
	mostrarDialogoDeResultado(resultado, DESCOMPRIMIR);
}

void Layout::mostrarDialogoDeResultado(int resultado, MODO modo) {
	Gtk::MessageDialog m("Indefinido");
	switch(resultado) {
	case CODIGO_OK:
		if (modo == COMPRIMIR) {
			m.set_message(MENSAJE_COMPRESION_OK); m.run(); }
		else if (modo == DESCOMPRIMIR) {
			m.set_message(MENSAJE_DESCOMPRESION_OK); m.run(); }
		break;
	case ERROR_ARCHIVO_VACIO:
		m.set_message(MENSAJE_ARCHIVO_VACIO); m.run();
		break;
	case ERROR_ARCHIVOS_IGUALES:
		m.set_message(MENSAJE_ARCHIVOS_IGUALES); m.run();
		break;
	default:
		break;
	}
}
